#include "logmodel.h"
#include <QFile>
#include <QTextStream>
#include <QDir>
#include <QJsonDocument>
#include <QDateTime>
#include <QRegularExpression>

LogModel::LogModel(QObject *parent) :
    QObject(parent),
    db(SQLiteDatabase::getInstance()),
    logManager(Logger())
{
    logManager.logInfo("LogModel 已初始化。");
}

// 查询日志时间戳的函数
QJsonArray LogModel::queryLogTimestamps()
{
    logManager.logDebug("开始查询所有日志时间戳。");

    QString condition = "type = 'file'";

    QJsonArray result;
    try {
        result = db->read("system_logs", condition);
        logManager.logDebug("查询成功执行。");
        if (result.isEmpty()) {
            logManager.logError("没有查询到符合条件的记录。");
        }
    } catch (const std::exception &e) {
        logManager.logError(QString("查询日志时间戳时发生异常：%1").arg(e.what()));
    } catch (...) {
        logManager.logError("查询日志时间戳时发生未知异常。");
    }

    return result;
}

// 从文件中读取日志的函数
QJsonArray LogModel::readLogsFromFiles(const QJsonArray& timestamps, const QString& startTime, const QString& endTime, const QString& logType)
{
    QJsonArray logs;
    QJsonArray filteredTimestamps;

    logManager.logDebug("开始过滤符合条件的时间戳。");

    QDateTime startDateTime = QDateTime::fromString(startTime, "yyyyMMdd_HHmmss");
    QDateTime endDateTime = QDateTime::fromString(endTime, "yyyyMMdd_HHmmss");

    if (!startDateTime.isValid() || !endDateTime.isValid()) {
        logManager.logError("起始时间或结束时间格式无效。");
        return logs;
    }

    // 过滤时间戳
    for (const QJsonValue &value : timestamps) {
        QJsonObject record = value.toObject();
        QString timestamp = record.value("timestamp").toString();
        QDateTime timestampDateTime = QDateTime::fromString(timestamp, "yyyyMMdd_HHmmss");
        if (!timestampDateTime.isValid()) {
            logManager.logWarning(QString("无效的时间戳格式：%1").arg(timestamp));
            continue;
        }

        if (timestampDateTime >= startDateTime && timestampDateTime <= endDateTime) {
            filteredTimestamps.append(record);
        }
    }

    logManager.logDebug(QString("过滤后的时间戳数量：%1").arg(filteredTimestamps.size()));

    // 读取日志文件
    for (const QJsonValue &value : filteredTimestamps) {
        QJsonObject record = value.toObject();
        QString timestamp = record.value("timestamp").toString();
        QString logFilePath = getLogFilePath(timestamp);

        QFile file(logFilePath);
        if (!file.exists()) {
            logManager.logError(QString("日志文件不存在：%1").arg(logFilePath));
            continue;
        }
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
            logManager.logError(QString("无法打开日志文件：%1").arg(logFilePath));
            continue;
        }

        QTextStream in(&file);
        QString fileContent = in.readAll();
        file.close();

        QJsonArray filteredLogs = filterLogsByType(fileContent, logType);
        for (const QJsonValue &log : filteredLogs) {
            QJsonObject logEntry;
            logEntry["timestamp"] = timestamp;
            logEntry["log"] = log.toString();
            logs.append(logEntry);
        }
    }

    if (logs.isEmpty()) {
        logManager.logInfo(QString("没有找到符合日志类型 '%1' 的日志内容。").arg(logType));
    }

    return logs;
}

// 获取日志文件路径的函数
QString LogModel::getLogFilePath(const QString& timestamp)
{
    return Logger().getLogFilePath(timestamp);
}

// 按日志类型过滤日志的函数
QJsonArray LogModel::filterLogsByType(const QString& logContent, const QString& logType)
{
    QJsonArray filteredLogs;

    // 处理所有类型的日志
    if (logType == "所有") {
        QStringList logLines = logContent.split('\n', Qt::SkipEmptyParts);
        for (const QString &line : logLines) {
            filteredLogs.append(line);
        }
        return filteredLogs;
    }

    QString actualLogType;
    if (logType == "信息") {
        actualLogType = "info";
    } else if (logType == "错误") {
        actualLogType = "error";
    } else if (logType == "调试") {
        actualLogType = "debug";
    } else {
        logManager.logError(QString("未知的日志类型：%1").arg(logType));
        return filteredLogs;
    }

    QRegularExpression regex(QString("\\[%1\\]").arg(actualLogType), QRegularExpression::CaseInsensitiveOption);
    QStringList logLines = logContent.split('\n', Qt::SkipEmptyParts);

    // 过滤符合条件的日志
    for (const QString &line : logLines) {
        if (regex.match(line).hasMatch()) {
            filteredLogs.append(line);
        }
    }

    return filteredLogs;
}

// 导出日志到 CSV 文件的函数
void LogModel::exportLogsToCSV(const QJsonArray& logs, const QString& filePath)
{
    logManager.logInfo("开始导出日志到 CSV。");

    QFile file(filePath);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        qCritical() << "无法打开文件进行写入：" << file.errorString();
        logManager.logError(QString("无法打开文件进行写入：%1").arg(file.errorString()));
        return;
    }

    QTextStream out(&file);
    if (!logs.isEmpty()) {
        out << "时间戳,日志内容\n";

        // 写入日志内容
        for (const QJsonValue &value : logs) {
            QJsonObject record = value.toObject();
            out << record.value("timestamp").toString() << "," << record.value("log").toString() << "\n";
        }
    }

    file.close();
    logManager.logInfo(QString("日志成功导出到 %1").arg(filePath));
}
